#include <iostream>
#include <vector>

using namespace std;

void counting_sort(vector<int> &vec)
{
    int len = vec.size();

    //寻找最大元素和最小元素
    int maxNum = vec[0];
    int minNum = vec[0];
    for(int i = 1; i < len; i++) //上面定义了下标0，从下标1开始寻找。
    {
        if(vec[i] > maxNum)
            maxNum = vec[i]; 
        if(vec[i] < minNum)
            minNum = vec[i];
    }

    //建立一个(最大元素 - 最小元素 + 1)的数组
    int lenCount = maxNum - minNum + 1;
    vector<int> vecCount(lenCount);
    
    //计数
    for(int i = 0; i < len; i++)
    {
        vecCount[vec[i] - minNum]++; //数组的下标不能是负数，所以原数组的数字映射现数组的下标可以这样表示
    }

    //统计计数的累计值
    for(int i = 1; i < lenCount; i++) //从第二个数开始，所以是i=1
    {
        vecCount[i] += vecCount[i - 1];
    }

    //创建数组保存排序的结果,注意数组长度
    vector<int> vecOutput(len);

    //将元素放到正确的位置上
    for(int i = 0; i < len; i++)
    {
        vecOutput[vecCount[vec[i] - minNum] - 1] = vec[i]; 
        vecCount[vec[i] - minNum]--;
    }

    //将结果复制回原数组
    swap(vec, vecOutput);
    
    //第二种将结果复制回原数组方法
    //while(len--)
    //{
    //    vec[len] = vecOutput[len];
    //}
    
    //第三种将结果复制回原数组方法
    //for(int i = 0; i < len; i++)
    //{
    //    vec[i] = vecOutput[i];
    //}
    
}

int main()
{
    int num;
    cin >> num;

    vector<int> vec;
    int temp;
    for(int i = 0; i < num; i++)
    {
        cin >> temp;
        vec.push_back(temp);
    }

    counting_sort(vec);

    for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}
